#include "databasehandler.h"
#include <QSqlError>
#include <QDebug>

// 构造函数，初始化数据库连接
DatabaseHandler::DatabaseHandler(QObject *parent) : QObject(parent)
{
    // 确保在初始化时关闭任何已打开的数据库连接
    if (db.isOpen())
        db.close();
}

/*
 * 连接到数据库
 * 参数: dbName - 数据库的文件路径
 * 返回: 连接成功返回 true，失败返回 false
 */
bool DatabaseHandler::connectToDatabase(const QString &dbName)
{
    // 检查是否已经存在默认的数据库连接
    if (QSqlDatabase::contains("qt_sql_default_connection")) {
        // 如果已存在，获取该连接
        db = QSqlDatabase::database("qt_sql_default_connection");
    } else {
        // 否则，添加一个新的 SQLite 数据库连接
        db = QSqlDatabase::addDatabase("QSQLITE"); // 使用 SQLite 驱动
    }

    // 设置数据库文件名
    db.setDatabaseName(dbName);

    // 尝试打开数据库
    if (!db.open()) {  // 检测是否成功打开
        // 打开失败，输出错误信息
        qWarning() << "Failed to open database:" << db.lastError().text();
        return false; // 连接失败
    }

    // 输出连接成功信息
    qDebug() << "Database connected successfully";
    return true; // 连接成功
}

/*
 * 执行 SQL 查询
*/
bool DatabaseHandler::executeQuery(QSqlQuery &query,const QString &queryStr) {
//    QSqlQuery query; // 创建一个查询对象
    // 尝试执行查询
    if (!query.exec(queryStr)) {
        // 执行失败，输出错误信息
        qWarning() << "Query execution failed:" << query.lastError().text();
        return false; // 查询失败
    }
    return true; // 查询成功
}

/*
 * 查询数据，封装成json
*/
void DatabaseHandler::fetchData(const QString &queryStr) {
    QJsonArray dataArrayJson;
    QSqlQuery query;
    if (!query.exec(queryStr)) {
        qDebug() << "Query execution failed:" << query.lastError();
        return;
    }
    dataContainer.clear(); // 清空容器
    dataArrayJson = QJsonArray(); // 清空容器

//dataArrayJson.clear();
    // 遍历查询结果，将每行数据存入 dataContainer
    while (query.next()) {
        QVariantList row;
        QJsonArray rowArry;
        for (int i = 0; i < query.record().count(); ++i) {
            row << query.value(i); // 将每列数据插入到行列表中
            dataArrayJson.append(QJsonValue::fromVariant(query.value(i)));
        }
        dataContainer << row; // 将整行添加到数据容器
        rowArry.append(rowArry);
    }

    result["data"] = dataArrayJson;
/*
 * {
 * code:1,
 * data: {
 *
 * 	}
 * }
*/
    qDebug() << "Fetched rows:" << dataContainer.size();
}

/*
 *打印出从数据库查出的数据
*/
void DatabaseHandler::printData() const {
    // 遍历容器中的数据，打印每一行每一列
    for (const auto &row : dataContainer) {
        for (const auto &col : row) {
            qDebug() << col.toString();
        }
        qDebug() << "-----"; // 分隔每行
    }
}
